package main

import "fmt"

//运算符

func main() {
	var (
		a = 5
		b = 2
	)
	//算数运算符
	fmt.Println(a + b)
	fmt.Println(a - b)
	fmt.Println(a * b)
	fmt.Println(a / b)
	fmt.Printf("%.2f \n", float64(a)/float64(b))
	a++ //单独的语句，不能放在=的右边赋值  ==  a=a+1
	b-- //单独的语句，不能放在=的右边赋值  ==  b=b-1
	fmt.Println(a % b)

	//关系运算符
	fmt.Println(a == b) //Go语言是强类型，相同类型的变量才能比较
	fmt.Println(a != b)
	fmt.Println(a >= b)
	fmt.Println(a > b)
	fmt.Println(a <= b)
	fmt.Println(a < b)

	//逻辑运算符
	//如果年龄大于18岁，并且  年龄小于60岁
	age := 22
	if age > 18 && age < 60 {
		fmt.Println("上班！")
	} else {
		fmt.Println("玩")
	}

	//如果年龄小于18岁，或者   年龄大于60岁
	if age < 18 || age > 60 {
		fmt.Println("玩！")
	} else {
		fmt.Println("上班")
	}

	//not取反，原来为真就为假，原来为假就为真
	isMarried := false
	fmt.Println(isMarried)
	fmt.Println(!isMarried)

	//位运算符：针对的是二进制，不足的位的，按0补入
	//5的二进制表示：101
	//2的二进制表示:  10
	//3的二进制表示:  11

	//&:按位与  （两位均为1才为1），不足位的，左侧补0
	fmt.Println(5 & 2) //000

	//|:按位或  （两位有一个为1就为1）
	fmt.Println(5 | 2) //111
	//^:相异或  （两位不一样则为1）
	fmt.Println(5 ^ 3) //110禁止

	// <<: 将二进制位左移指定位数,
	//“a<<b”是把a的各二进位全部左移b位，高位丢弃，低位补0。
	fmt.Println(5 << 1) //1010

	// >>: 将二进制右移指定位数，“a>>b”是把a的各二进位全部右移b位。
	fmt.Println(5 >> 1)

	//只能存8位
	/* var m = int8(1)
	fmt.Println(m << 10) */

	//ip地址中每一段都是8bit位 192.168.1.1
	//0644   八进制，文件权限

	//赋值运算符，用来给变量赋值
	var x int
	x = 10
	fmt.Println(x)
	x += 1 //x=x+1
	fmt.Println(x)
	x -= 2 //x=x-2
	fmt.Println(x)
	x *= 2 //x=x*2
	fmt.Println(x)
	x /= 2 //x=x/2
	fmt.Println(x)
	x %= 2 //x=x%2
	fmt.Println(x)
	x <<= 2 //x= x<<2
	fmt.Println(x)
	x >>= 1 //x= xx>>1
	fmt.Println(x)
	x &= 6 //  2和4的二进制  x=n  x&6   10   110  = 010
	fmt.Println(x)
	x |= 4 //  2和4的二进制  x=n  x|14  10   100  = 110
	fmt.Println(x)
	x ^= 4 //  6和4的二进制  x=n  x^14  110  100  = 010
	fmt.Println(x)
}
